package cn.good.yan.service.t9;

import org.openjdk.jol.info.ClassLayout;

/**
 * 9. JOL - 分析对象在JDK的大小和分布
 * openjdk 分析对象在JDK的大小和分布
 * <dependency>
 * <groupId>org.openjdk.jol</groupId>
 * <artifactId>jol-core</artifactId>
 * <version>0.9</version>
 * </dependency>
 * 1 默认配置，启动了压缩指针，-XX:+UseCompressedClassPointers，通过JDK添加配置
 * 12 + 4(对齐填充) = 一个对象16字节
 * 2 手动配置，关闭了压缩指-XX:-UseCompressedClassPointers，针，
 * 8 + 8 = 一个对象16字节
 *
 * @author shengren.yan
 * @create 2024-04-08
 */
public class ObjectHeadDemo1 {


    // JOL - 分析对象在JDK的大小和分布
    public static void main(String[] args) {
        // new一个对象，占内存多少？
//        Object o = new Object();
//        // 这个hashcode记录在对象的什么地方？
//        System.out.println(o.hashCode());
//        // 手动JC ， 15次从新生代 - 老年代
//        System.gc();
//        //  VM的细节详细情况
//        System.out.println(VM.current().details());
//        //  所有的对象分配的字节都是8的整数倍
//        System.out.println(VM.current().objectAlignment());

        // 16 bytes
        Object o1 = new Object();
        // 打印 Object 的对象在JDK的大小和分布
        System.out.println(ClassLayout.parseInstance(o1).toPrintable());
        // 打印的信息：OFFSET（偏移量，该字段位置所占的byte数） SIZE（后面类型的字节大小） TYPE（Class中定义的类型） DESCRIPTION（类型的描述）VALUE（TYPE在内存中的值）
//        OFFSET  SIZE   TYPE DESCRIPTION                               VALUE
//        0     4        (object header)                           01 00 00 00 (00000001 00000000 00000000 00000000) (1)
//        4     4        (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
//        8     4        (object header)                           e5 01 00 f8 (11100101 00000001 00000000 11111000) (-134217243)
//        12     4        (loss due to the next object alignment)
//        Instance size: 16 bytes
        System.out.println("--------------------------");
        //  24 bytes
        Customer c1 = new Customer();
        System.out.println(ClassLayout.parseInstance(c1).toPrintable());
        // 打印的信息：
//        com.crm.yan.juc.t8.Customer object internals:
//        OFFSET  SIZE      TYPE DESCRIPTION                               VALUE
//        0     4           (object header)                           05 00 00 00 (00000101 00000000 00000000 00000000) (5)
//        4     4           (object header)                           00 00 00 00 (00000000 00000000 00000000 00000000) (0)
//        8     4           (object header)                           b2 69 02 f8 (10110010 01101001 00000010 11111000) (-134059598)
//        12     4       int Customer.id                               0
//        16     1   boolean Customer.flag                             false
//        17     1   boolean Customer.flag2                            false
//        18     6           (loss due to the next object alignment)
//        Instance size: 24 bytes
    }
}


// 只有一个对象头的实例对象，16字节（忽略压缩指针的影响）+4字节+1字节=21字节----》对其填充，24字节
class Customer {
    //1 第一种情况，只有对象头，没有其它任何实例数据
    //2 第二种情况，int + boolean，默认满足对其填充，24 bytes
    int id;
    boolean flag = false;
    boolean flag2 = false;
}